﻿//----------------------------------------------
//            NGUI: Next-Gen UI kit
// Copyright © 2011-2012 Tasharen Entertainment
//----------------------------------------------

using UnityEngine;

/// <summary>
/// Convenience script that resizes the camera's orthographic size to match the screen size.
/// This script can be used to create pixel-perfect UI, however it's usually more convenient
/// to create the UI that stays proportional as the screen scales. If that is what you
/// want, you don't need this script (or at least don't need it to be active).
/// 
/// 便利的脚本，相机的正投影尺寸的大小调整到适合屏幕的尺寸。
/// 这个脚本可以被用来创建像素完美的UI，但是它通常是更方便
/// 创建UI的屏幕比例保持比例。如果这是你
/// 想要的，你并不需要此脚本（或者至少不需要它被激活）。 
/// </summary>

/*
 * 脚本运行在编辑器模式
 * RequireComponent属性可以允许自动添加需要的组件作为一个附属。
 * AddComponentMenu 添加组件菜单
 */
[ExecuteInEditMode]
[RequireComponent(typeof(Camera))]
[AddComponentMenu("NGUI/UI/Orthographic Camera")]
public class UIOrthoCamera : MonoBehaviour
{
    /// <summary>
    /// 当前相机
    /// </summary>
	Camera mCam;
    /// <summary>
    /// 当前transform对象
    /// </summary>
	Transform mTrans;

	void Start ()
	{
        /*
         * 初始化相机和transform对象
         * 初始化相机为正交(true),透视(false)
         */
		mCam = camera;
		mTrans = transform;
		mCam.orthographic = true;
	}

	void Update ()
	{
        /*
         * Camera.rect 相继被渲染到屏幕规范化坐标中的位置，rect的范围总0（左/下）到1（右/上）
         * Rect 一个由x、y位置和width、height大小定义的二维矩形。
         * y0 = 相机渲染矩形顶坐标 * 当前屏幕高度
         * y1 = 相机渲染矩形低坐标 * 当前屏幕高度
         */
        float y0 = mCam.rect.yMin * Screen.height;
		float y1 = mCam.rect.yMax * Screen.height;

        /*
         * lossyScale 有损缩放,物体的全局缩放（只读）
         * 请注意日光你有一个有缩放的父物体变换和子物体有任意旋转的，缩放将有偏差。
         * 因此缩放不能正确的表示在3组件的向量，而是一个3x3矩阵。
         * 这样表示工作十分不方便，lossyScale是个很方便的属性，它尽量匹配实际世界缩放，
         * 如果你的物体不是有偏差的，这个值将是完全正确的，如果物体包含偏差，这个值也不会有很大的不同。
         */
        float size = (y1 - y0) * 0.5f * mTrans.lossyScale.y;

        /*
         * Mathf.Approximately 比较两个浮点数值，看它们是否非常接近。
         * 由于浮点数值不精确，不建议使用等于来比较它们。例如，1.0==10.0/10.0也许不会返回true
         * 
         * 如果当前相机正交区域与屏幕正交区域不接近，就设置当前相机在正交模式下相机的一半尺寸
         */
        if (!Mathf.Approximately(mCam.orthographicSize, size)) mCam.orthographicSize = size;
	}
}